package br.com.devmedia.modelo.dao;

import java.util.List;

import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.servlet.http.HttpServletRequest;

import br.com.devmedia.util.UtilMensagens;

public class HibernateDAO<T> implements InterfaceDAO<T> {

	private EntityManager manager;
	private Class<T> classe;

	public HibernateDAO(Class<T> classe) {
		this.classe = classe;
		this.manager = null;
	}

	@Override
	public List<T> listarTodos() {		
		this.manager = getEntityManager();
		String sql = "SELECT o FROM " + classe.getSimpleName() + " o";
		TypedQuery<T> query = manager.createQuery(sql, classe);
		return query.getResultList();
	}

	public void gravar(T obj) {
		this.manager = getEntityManager();
		manager.persist(obj);
		UtilMensagens.mensagemInformacao("Objeto salvo com sucesso.");
	}

	public void atualizar(T obj) {
		this.manager = getEntityManager();
		manager.merge(obj);
		UtilMensagens.mensagemInformacao("Objeto atualizado com sucesso.");
	}

	public void excluir(T obj) {
		this.manager = getEntityManager();
		manager.remove(obj);
		UtilMensagens.mensagemInformacao("Objeto removido com sucesso.");
	}

	public T busca(Integer id) {
		this.manager = getEntityManager();
		return manager.find(classe, id);
	}
	
	private EntityManager getEntityManager() {
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		return (EntityManager) request.getAttribute("manager");
	}
}
